package service;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.NoResultException;

import model.Behandling;
import model.DelBehandling;
import model.DelBehandlingDragering;
import model.DelBehandlingPakkeKlar;
import model.DelBehandlingTorreTid;
import model.Lager;
import model.LagerPlads;
import model.MellemVare;
import model.ProduktType;
import dao.Dao;
/**
 * 
 * @author Martin Sax og Søren
 *
 */
public class Service {

	public static ProduktType opretProduktType(String navn,
			Behandling behandling) {
		ProduktType p = new ProduktType(navn, behandling);
		Dao.getUnikInstance().storeProduktType(p);
		return p;
	}

	public static List<ProduktType> deleteProduktType(ProduktType p) {
		Dao.getUnikInstance().removeProduktType(p);
		return new ArrayList<ProduktType>(Dao.getUnikInstance()
				.getProduktTyper());
	}

	public static ProduktType updateProduktType(String navn,
			String beskrivelse, Behandling behandling, ProduktType p) {
		p.setNavn(navn);
		p.getBehandling().setBeskrivelse(beskrivelse);
		p.setBehandlingUD(behandling);		
		Dao.getUnikInstance().storeProduktType(p);
		return p;
	}

	public static List<ProduktType> getAllProduktType() {
		return new ArrayList<ProduktType>(Dao.getUnikInstance()
				.getProduktTyper());
	}

	public static MellemVare registrerMellemvare(ProduktType p) {
		MellemVare m;
		LagerPlads lp = Dao.getUnikInstance().getLager().getFriPlads();
		if (lp != null) {
			m = new model.MellemVare(p.getNavn(), p.getBehandling(),Dao.getUnikInstance().getLager().getNaesteVareNr());
			lp.setMellemVare(m);
			Dao.getUnikInstance().storeMellemvare(m);
		} else {
			throw new RuntimeException("Der er ingen frie lager pladser");
		}
		return m;
	}

	public static MellemVare registrerMellemvare(long vareNr) {
		MellemVare m = null;
		int i = 0;
		boolean found = false;
		while (i < Dao.getUnikInstance().getMellemvarer().size() && !found) {
			if (Dao.getUnikInstance().getMellemvarer().get(i).getVareNummer() == vareNr) {
				found = true;
				m = Dao.getUnikInstance().getMellemvarer().get(i);
				if (Dao.getUnikInstance().getLager().getFriPlads() != null) {
					Dao.getUnikInstance().getLager().getFriPlads().setMellemVare(m);
				} else {
					throw new RuntimeException(
							"Der er ingen frie lager pladser");
				}
			} else {
				i++;
			}
		}
		return m;
	}

	/**
	 * Skal nok testes
	 * 
	 * @param m
	 * @return
	 */
	public static MellemVare timeStampMellemVare(MellemVare m) {
		if (m.getTimeStamp().getDelBehandling() instanceof DelBehandlingPakkeKlar) {
			m.nextDelBehandling();
			Service.getLager().fjernMellemvare(m);
		} else if (m.getTimeStamp().getDelBehandling() instanceof DelBehandlingTorreTid) {
			m.nextDelBehandling();
			if (m.getTimeStamp().getDelBehandling() instanceof DelBehandlingPakkeKlar) {

			} else {
				Service.getLager().fjernMellemvare(m);
			}

		} else if (m.getTimeStamp().getDelBehandling() instanceof DelBehandlingDragering) {
			m.nextDelBehandling();
			Service.getLager().getFriPlads().setMellemVare(m);
		}
		Dao.getUnikInstance().storeMellemvare(m);
		return m;
	}

	public static List<MellemVare> getAllMellemVare() {
		return new ArrayList<MellemVare>(Dao.getUnikInstance().getMellemvarer());
	}

	public static Behandling opretBehandling(String navn, int max) {
		Behandling b = new Behandling(navn, max);
		Dao.getUnikInstance().storeBehandlinger(b);
		return b;
	}

	public static Behandling updateBehandling(String navn,
			List<DelBehandling> delB, Behandling b) {
		b.setNavn(navn);
		Dao.getUnikInstance().storeBehandlinger(b);
		return b;
	}

	public static List<Behandling> deleteBehandling(Behandling b) {
		Dao.getUnikInstance().removeBehandlinger(b);
		return new ArrayList<Behandling>(Dao.getUnikInstance()
				.getBehandlinger());
	}

	public static List<Behandling> getAllBehandlinger() {
		return new ArrayList<Behandling>(Dao.getUnikInstance()
				.getBehandlinger());
	}

	public static Lager getLager() {
		Lager l = null;
		try{
			l = Dao.getUnikInstance().getLager();
		}catch (Exception e){
			Dao.getUnikInstance().createLager();
			l = Dao.getUnikInstance().getLager();
			makeSomeObjects();
		}
		return l;
	}

	/**
	 * @ Aouther Daniel Engel
	 */

	public static void makeSomeObjects() {
		service.Service.getLager();
		Behandling b1 = service.Service.opretBehandling("FrugtFlæsk type 4", 9);
		Behandling b2 = service.Service.opretBehandling("Lakrids type 1.1", 20);
		b1.createDelBehandling(10, 20, 30);
		b1.createDelBehandling();
		service.Service.opretProduktType("FrugtFlæsk", service.Service
				.getAllBehandlinger().get(1));
		service.Service.opretProduktType("Lakrids", service.Service
				.getAllBehandlinger().get(0));
		service.Service.registrerMellemvare(service.Service.getAllProduktType().get(0));
		service.Service.registrerMellemvare(service.Service.getAllProduktType().get(0));
		service.Service.registrerMellemvare(service.Service.getAllProduktType().get(0));
		service.Service.registrerMellemvare(service.Service.getAllProduktType().get(0));
		service.Service.registrerMellemvare(service.Service.getAllProduktType().get(1));
		service.Service.registrerMellemvare(service.Service.getAllProduktType().get(1));
		service.Service.registrerMellemvare(service.Service.getAllProduktType().get(1));
		service.Service.registrerMellemvare(service.Service.getAllProduktType().get(1));
		
	}

}
